"""
生成演示数据脚本
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from faker import Faker
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import random

fake = Faker('zh_CN')
Faker.seed(42)
np.random.seed(42)
random.seed(42)


def generate_students(n=1000):
    """生成学生数据"""
    students = []
    majors = ['计算机科学与技术', '软件工程', '数据科学与大数据技术', '人工智能', '网络工程', '信息安全']
    
    for i in range(n):
        student_id = f"2021{str(i+1).zfill(6)}"
        username = f"student{i+1}"
        
        students.append({
            'student_id': student_id,
            'username': username,
            'email': f"{username}@university.edu.cn",
            'password': 'password123',
            'first_name': fake.first_name(),
            'last_name': fake.last_name(),
            'phone': fake.phone_number(),
            'major': random.choice(majors),
            'grade_level': random.choice([1, 2, 3, 4]),
            'enrollment_date': '2021-09-01'
        })
    
    df = pd.DataFrame(students)
    df.to_csv('data/students.csv', index=False, encoding='utf-8-sig')
    print(f"✓ Generated {n} students -> data/students.csv")
    return df


def generate_teachers(n=30):
    """生成教师数据"""
    teachers = []
    departments = ['计算机学院', '软件学院', '人工智能学院', '网络空间安全学院']
    titles = ['讲师', '副教授', '教授']
    
    for i in range(n):
        employee_id = f"T{str(i+1).zfill(4)}"
        username = f"teacher{i+1}"
        
        teachers.append({
            'employee_id': employee_id,
            'username': username,
            'email': f"{username}@university.edu.cn",
            'password': 'password123',
            'first_name': fake.first_name(),
            'last_name': fake.last_name(),
            'phone': fake.phone_number(),
            'department': random.choice(departments),
            'title': random.choice(titles),
            'bio': fake.text(max_nb_chars=200)
        })
    
    df = pd.DataFrame(teachers)
    df.to_csv('data/teachers.csv', index=False, encoding='utf-8-sig')
    print(f"✓ Generated {n} teachers -> data/teachers.csv")
    return df


def generate_courses(n=50):
    """生成课程数据"""
    courses = []
    
    course_list = [
        {'name': 'C语言程序设计', 'dept': '计算机学院', 'credits': 4.0, 'tags': 'C语言,编程基础,程序设计'},
        {'name': 'Python程序设计', 'dept': '计算机学院', 'credits': 3.0, 'tags': 'Python,编程基础,脚本语言'},
        {'name': '数据结构', 'dept': '计算机学院', 'credits': 4.0, 'tags': '数据结构,算法,编程'},
        {'name': '算法设计与分析', 'dept': '计算机学院', 'credits': 3.0, 'tags': '算法,编程,复杂度分析'},
        {'name': '操作系统', 'dept': '计算机学院', 'credits': 4.0, 'tags': '操作系统,系统编程,Linux'},
        {'name': '计算机网络', 'dept': '网络空间安全学院', 'credits': 3.0, 'tags': '网络,协议,TCP/IP'},
        {'name': '数据库原理', 'dept': '软件学院', 'credits': 3.5, 'tags': '数据库,SQL,关系模型'},
        {'name': 'Web开发技术', 'dept': '软件学院', 'credits': 3.0, 'tags': 'Web,HTML,CSS,JavaScript'},
        {'name': '机器学习', 'dept': '人工智能学院', 'credits': 4.0, 'tags': '机器学习,人工智能,算法'},
        {'name': '深度学习', 'dept': '人工智能学院', 'credits': 3.5, 'tags': '深度学习,神经网络,AI'},
        {'name': '计算机组成原理', 'dept': '计算机学院', 'credits': 4.0, 'tags': '硬件,计算机体系结构'},
        {'name': '软件工程', 'dept': '软件学院', 'credits': 3.0, 'tags': '软件工程,项目管理,UML'},
        {'name': '编译原理', 'dept': '计算机学院', 'credits': 3.5, 'tags': '编译器,语法分析,代码生成'},
        {'name': '信息安全', 'dept': '网络空间安全学院', 'credits': 3.0, 'tags': '安全,加密,网络安全'},
        {'name': '大数据技术', 'dept': '软件学院', 'credits': 3.0, 'tags': '大数据,Hadoop,Spark'},
        {'name': '云计算技术', 'dept': '软件学院', 'credits': 3.0, 'tags': '云计算,虚拟化,分布式'},
        {'name': '移动应用开发', 'dept': '软件学院', 'credits': 3.0, 'tags': '移动开发,Android,iOS'},
        {'name': '计算机视觉', 'dept': '人工智能学院', 'credits': 3.5, 'tags': '计算机视觉,图像处理,CNN'},
        {'name': '自然语言处理', 'dept': '人工智能学院', 'credits': 3.5, 'tags': 'NLP,文本处理,语言模型'},
        {'name': '区块链技术', 'dept': '网络空间安全学院', 'credits': 3.0, 'tags': '区块链,加密货币,智能合约'},
        {'name': 'Linux系统管理', 'dept': '计算机学院', 'credits': 2.5, 'tags': 'Linux,系统管理,Shell'},
        {'name': 'Java程序设计', 'dept': '软件学院', 'credits': 3.5, 'tags': 'Java,面向对象,编程'},
        {'name': '人工智能导论', 'dept': '人工智能学院', 'credits': 3.0, 'tags': 'AI,机器学习,专家系统'},
        {'name': '图形学基础', 'dept': '计算机学院', 'credits': 3.0, 'tags': '图形学,OpenGL,渲染'},
        {'name': '嵌入式系统', 'dept': '计算机学院', 'credits': 3.5, 'tags': '嵌入式,ARM,单片机'},
    ]
    
    semesters = ['2023春季', '2023秋季', '2024春季', '2024秋季']
    
    for i, course_info in enumerate(course_list[:n]):
        code = f"CS{str(i+101)}"
        
        courses.append({
            'code': code,
            'name': course_info['name'],
            'description': f"本课程介绍{course_info['name']}的基本概念、原理和应用。",
            'credits': course_info['credits'],
            'department': course_info['dept'],
            'instructor_username': f"teacher{random.randint(1, 30)}",
            'semester': random.choice(semesters),
            'max_students': random.randint(100, 200),
            'tags': course_info['tags']
        })
    
    df = pd.DataFrame(courses)
    df.to_csv('data/courses.csv', index=False, encoding='utf-8-sig')
    print(f"✓ Generated {len(courses)} courses -> data/courses.csv")
    return df


def generate_grades(students_df, courses_df, n_records=20000):
    """生成成绩数据"""
    grades = []
    
    # 每个学生随机选5-15门课
    for _, student in students_df.iterrows():
        n_courses = random.randint(5, 15)
        selected_courses = courses_df.sample(n=n_courses)
        
        for _, course in selected_courses.iterrows():
            # 生成符合正态分布的成绩
            base_score = np.random.normal(75, 15)
            score = np.clip(base_score, 0, 100)
            
            # 期中期末成绩
            midterm = np.clip(np.random.normal(score, 5), 0, 100)
            final = np.clip(np.random.normal(score, 5), 0, 100)
            
            # 出勤
            total_classes = random.randint(30, 48)
            attended = int(total_classes * np.random.beta(8, 2))  # 大部分学生出勤率高
            attendance_rate = (attended / total_classes) * 100
            
            # 入学日期（在课程学期内随机日期）
            base_date = datetime(2023, 9, 1)
            enrollment_date = base_date + timedelta(days=random.randint(0, 30))
            
            grades.append({
                'student_id': student['student_id'],
                'course_code': course['code'],
                'enrollment_date': enrollment_date.strftime('%Y-%m-%d'),
                'status': 'completed' if score >= 40 else random.choice(['completed', 'dropped']),
                'score': round(score, 2),
                'midterm_score': round(midterm, 2),
                'final_score': round(final, 2),
                'total_classes': total_classes,
                'attended': attended,
                'attendance_rate': round(attendance_rate, 2)
            })
            
            if len(grades) >= n_records:
                break
        
        if len(grades) >= n_records:
            break
    
    df = pd.DataFrame(grades)
    df.to_csv('data/grades.csv', index=False, encoding='utf-8-sig')
    print(f"✓ Generated {len(grades)} grade records -> data/grades.csv")
    return df


def main():
    """主函数"""
    print("=" * 60)
    print("生成IT课程分析系统演示数据")
    print("=" * 60)
    
    # 创建data目录
    os.makedirs('data', exist_ok=True)
    
    # 生成数据
    students_df = generate_students(1000)
    teachers_df = generate_teachers(30)
    courses_df = generate_courses(25)
    grades_df = generate_grades(students_df, courses_df, 20000)
    
    print("\n" + "=" * 60)
    print("数据生成完成！")
    print("=" * 60)
    print("\n数据统计:")
    print(f"  - 学生数: {len(students_df)}")
    print(f"  - 教师数: {len(teachers_df)}")
    print(f"  - 课程数: {len(courses_df)}")
    print(f"  - 成绩记录数: {len(grades_df)}")
    print("\n数据文件位置:")
    print("  - data/students.csv")
    print("  - data/teachers.csv")
    print("  - data/courses.csv")
    print("  - data/grades.csv")
    print("\n接下来请运行数据导入脚本导入数据到数据库")


if __name__ == '__main__':
    main()










